﻿/*****************************************************************//**
 *
 * @file   FITKAbaqusAdaptorStep.h
 * @brief  Abaqus Step 适配器 用于读取INP过程中的Step解析。
 * @author fulipeng (flipengqd@yeah.net)
 * @date   2024-03-29
 *
 *********************************************************************/
#ifndef __FITKABAQUSADAPTORSTEPDYNAMIC__H__
#define __FITKABAQUSADAPTORSTEPDYNAMIC__H__

#include "FITKAbaqusAbstractAdaptor.h"
#include "FITKAbaqusGetInterfaceTool.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"

 //前置声明
ForwardDeclarNS(AbaqusData, FITKDataCase)
ForwardDeclarNS(Interface, FITKAbaStepManager)
ForwardDeclarNS(Interface, FITKAbaStepDynamicExplicit)
ForwardDeclarNS(Interface, FITKAbaMassScalingDefinition)
namespace IO
{
    /**
     * @brief Abaqus Step 读写适配器
     * @author fulipeng (fulipengqd@yeah.net)
     * @date 2024-03-29
     */
    class FITKAbaqusAdaptorStepDynamic : public FITKAbaqusAbstractAdaptor
    {
    public:
        explicit FITKAbaqusAdaptorStepDynamic() = default;
        ~FITKAbaqusAdaptorStepDynamic() = default;

        /**
         * @brief 获取适配器数据类型名
         * @return 适配器数据类型名
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-29
         */
        QString getAdaptorClass() override;

        /**
         * @brief 设置算例数据对象
         * @param caseData 算例数据对象
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-29
         */
        void setCaseData(AbaqusData::FITKDataCase* caseData);

        /**
         * @brief 适配器读取
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-29
         */
        bool adaptR() override;

        /**
         * @brief 适配器写出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-29
         */
        bool adaptW() override;


    private:

        /**
         * @brief 读取动态显示参数
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-29
         */
        bool readDynamicExplicit();

        /**
         * @brief 读取动态子空间参数
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-29
         */
        bool readDynamicSubspace();
        /**
         * @brief 读取体积粘度
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-29
         */
        bool readBulkViscosity();

        /**
         * @brief 读取固定质量缩放
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-03-29
         */
        bool readFixedMassScaling();

        /**
         * @brief 读取可变质量缩放
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-25
         */
        bool readVariableMassScaling();

        /**
         * @brief 读取AutomaticMassScaling质量缩放
         * @param massScaling 质量缩放数据
         * @param line 行数据
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-07-03
         */
        bool readAutomaticMassScaling(Interface::FITKAbaMassScalingDefinition* massScaling, QString line);


        /**
         * @brief 写出动态显示参数
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-29
         */
        bool writeDynamicExplicit();

        /**
         * @brief 写出体积粘度
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-29
         */
        bool writeBulkViscosity();

        /**
         * @brief 写出固定质量缩放
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-03-29
         */
        bool writeFixedMassScaling();

        /**
         * @brief 写出半自动类型
         * @param massScaling 质量点数据对象
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-05-29
         */
        bool writeSemiAutomaticMassScaling(Interface::FITKAbaMassScalingDefinition* massScaling);
        /**
         * @brief 写出自动类型
         * @param massScaling 质量点数据对象
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-07-04
         */
        bool writeAutomaticMassScaling(Interface::FITKAbaMassScalingDefinition* massScaling);
        /**
         * @brief 重新初始化质量
         * @param massScaling 质量点数据对象
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-07-04
         */
        bool writeReinitializeMass(Interface::FITKAbaMassScalingDefinition* massScaling);
        /**
         * @brief 整个载荷步关闭质量缩放
         * @param massScaling 质量点数据对象
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-07-04
         */
        bool writeDisaleMassScalingThroughoutStep(Interface::FITKAbaMassScalingDefinition* massScaling);

    private:

        /**
         * @brief 分析步（Step）数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        Interface::FITKAbaStepDynamicExplicit* _stepData{};

        /**
         * @brief 算例数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-29
         */
        AbaqusData::FITKDataCase* _caseData{};

        /**
         * @brief 获取接口 工具类
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-25
         */
        FITKAbaqusGetInterfaceTool tool;

    };

    Register2FITKIOAdaptorFactory(INP, Interface::FITKAbaStepDynamicExplicit, FITKAbaqusAdaptorStepDynamic)
}

#endif